package com.gaohe.controller;

import cn.hutool.crypto.digest.MD5;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.gaohe.common.BaseContext;
import com.gaohe.common.R;
import com.gaohe.pojo.Admin;
import com.gaohe.service.AdminService;
import jakarta.servlet.http.HttpSession;
import lombok.extern.slf4j.Slf4j;
import org.apache.tomcat.util.security.MD5Encoder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.repository.query.Param;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;
import java.util.List;
import java.util.concurrent.TimeUnit;
// @CrossOrigin注解是Spring框架提供的一种注解，用于配置CORS策略。
// 通过在控制器类或方法上添加@CrossOrigin注解，我们可以指定哪些来源可以访问该类或方法，从而实现对CORS的简化配置。
// @CrossOrigin注解支持多种配置选项，例如允许特定来源、允许所有来源、指定请求头和响应头等。

@CrossOrigin(originPatterns = "*")
@RestController
@RequestMapping("/admin")
@Slf4j
public class AdminController {
    @Autowired
    AdminService adminService;

    @Autowired
    RedisTemplate redisTemplate;

    @PostMapping("/login")
    public R login(@RequestBody Admin admin, HttpSession httpSession)
    {
        String username = admin.getUsername();
        String password = admin.getPassword();
        log.info("username:{},password:{}",username,password);
//        md5加密
        String md5 = MD5.create().digestHex(password);
        LambdaQueryWrapper<Admin>lq = new LambdaQueryWrapper<>();
        lq.eq(Admin::getUsername,username);
        Admin admin1 = adminService.getOne(lq);
        if(admin1 == null)
        {
            return R.error("用户不存在");
        }
        if(!admin1.getPassword().equals(md5))
        {
            return R.error("密码错误");
        }
        if(admin1.getStatus() != 1)
        {
            return R.error("该用户已被禁用");
        }

//        存储用户id
//        httpSession.setAttribute("username",admin1);
//        登录业务会话存储在redis
        redisTemplate.opsForValue().set("auth"+admin1.getId(),
                admin1.getId(),
//                30分钟内不需要再登录
                30,
                TimeUnit.MINUTES
                );
        System.err.println(admin1.getId());
        return R.success(admin1);

    }
//    退出员工管理系统后，取消登录状态
    @GetMapping("/logout")
    public R logout()
    {
        Long id = BaseContext.getCurrentId();
        redisTemplate.delete("auth" + id);
        return R.success("移除成功");
    }

//    分页查询
    @GetMapping("/page")
    public R page(@RequestParam Integer page, @RequestParam Integer pageSize, @RequestParam(required = false) String name)
    {
//        Page是一个ArrayList实现，存储查询结果，PageInfo则包含更多分页信息如导航页码。
//        使用Page还是PageInfo取决于前端需求，通常PageInfo更适合提供详细的分页数据。
        Page<Admin> page1 = new Page<>(page,pageSize);
        LambdaQueryWrapper<Admin>qw = new LambdaQueryWrapper<>();
//        根据名字调查
        qw.like(!StringUtils.isEmpty(name),Admin::getName,name);
        qw.orderByDesc(Admin::getUpdateTime);
        qw.orderByAsc(Admin::getName);
        return R.success(adminService.page(page1, qw));
    }

//    新增员工
    @PostMapping
    public R save(@RequestBody Admin admin,HttpSession session){
        admin.setPassword(MD5.create().digestHex(admin.getPassword()));
        admin.setStatus(1);
        admin.setCreateTime(LocalDateTime.now());
        admin.setUpdateTime(LocalDateTime.now());
//        从session获取当前登录的信息
//        Long user = (Long) session.getAttribute("user");

        Long user = (Long)redisTemplate.opsForValue().get("auth");
        admin.setUpdateUser(user);
        admin.setCreateUser(user);
        boolean flag = adminService.save(admin);
        return flag?R.success("新增成功"):R.error("新增失败");
    }

//     修改员工任职状态
    @PutMapping("/changeStatus")
    public R changeStatus(@RequestBody Admin admin,HttpSession session)
    {
       admin.setUpdateTime(LocalDateTime.now());
//       (Long) session.getAttribute("user")
       admin.setUpdateUser((Long) redisTemplate.opsForValue().get("auth"));
       boolean flag = adminService.updateById(admin);
       return flag?R.success("修改成功"):R.error("修改失败");
    }
//      获取id
    @GetMapping("{id}")
    private R getId(@PathVariable Long id)
    {
        return R.success(adminService.getById(id));
    }

//    编辑员工信息
    @PutMapping
    public R update(@RequestBody Admin admin)
    {
        admin.setPassword(MD5.create().digestHex(admin.getPassword()));
        admin.setUpdateTime(LocalDateTime.now());
        boolean flag = adminService.updateById(admin);
        return flag?R.success("修改成功"):R.error("修改失败");
    }
//    查询管理员的姓名和手机号
    @GetMapping
    public R list()
    {
        LambdaQueryWrapper<Admin>lqw = new LambdaQueryWrapper<>();
        lqw.select(Admin::getName,Admin::getPhone);
        List<Admin> list = adminService.list(lqw);
        return R.success(list);
    }
}
